package com.lifp.thread.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @Description Runnable 与 Callable 比较
 * @Author lfp
 * @Date 2022/7/26
 * @Version 1.0
 */


/**
 * 实现Runnable接口
 *    无返回值，不会抛异常
 *
 */
class RunnableThread implements Runnable{
    @Override
    public void run() {

    }
}

/**
* 实现Callable接口
*    1.支持泛型，有返回值
*    2.会抛异常
*
*/
class CallableThread implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        return 200;
    }
}


public class CallableVSRunnableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {

        //创建Runnable线程
        new Thread(new RunnableThread(),"AA").start();


        //Callable接口，不可以通过如下这种方式创建线程，需要通过FutureTask来创建
        //new Thread(new CallableThread(),"BB").start();


        //创建FutureTask 第一种写法
        //FutureTask<Integer> futureTask = new FutureTask<>(new CallableThread());

        //创建FutureTask 第二种写法，用Lambda表达式，简化写法
        FutureTask<Integer> futureTask = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + " come in callable");
            return 1024;
        });
        //创建Callable线程
        new Thread(futureTask,"BB").start();

        while (!futureTask.isDone()){
            System.out.println("wait......");
        }
        //调用FutureTask 的 get()方法,获取执行结果
        Integer integer = futureTask.get();
        System.out.println(integer);

        //线程执行完毕，打印主线程日志
        System.out.println(Thread.currentThread().getName() + " come over");
    }
}
